package com.example.mq.mqServer.core.message;

import com.example.mq.mqServer.core.message.BasicProperties;
import lombok.Data;

import java.io.Serializable;
import java.util.UUID;

/**
 * @BelongsProject: 0.mq
 * @BelongsPackage: com.example.mq.mqServer.core
 * @Author : 游在海里的鱼
 * @CreateTime : 2023-11-22  12:04
 * @Version : 1.0
 * @Description : MQ中的消息
 */
@Data
//serializable（串行化/序列化），一个特殊之处：实现这个接口却不用重写任何方法，实现这个接口后，对象可以在对象和字节流中相互转换
public class Message implements Serializable {
    //基础属性
    private BasicProperties basicProperties;
    //储存数据
    private byte[] body;

    //message持久化是存在文件里的，所以使用下文两个偏移量来表示消息在文件里的位置（左闭右开）
    //这两个属性不用存储进字节流，使用transient来表示不序列化
    private transient long offsetBeg; //消息开头距离文件开头的偏移量（单位字节）
    private transient long offsetEnd; //消息末尾距离文件开头的偏移量（单位字节）
    //消息在文件中是否有效（逻辑删除）,1有效，0无效（boolean存储在文件中时，占据多少个字节不好说，所以使用byte来表示对错）
    //这个并不是不序列化，而是由我们手动进行序列化
    private transient byte isValid = 1;

    //使用工厂方法来创建message对象
    private Message(){
        this.basicProperties = new BasicProperties();
        this.body = null;
    }
    public static Message MessageFactory(String routingKey,BasicProperties basicProperties,byte[] body){
        Message message = new Message();

        message.setId("M-"+UUID.randomUUID().toString());
        message.setBody(body);
        message.setRoutingKey(routingKey);
        if(basicProperties != null){
            message.setBasicProperties(basicProperties);
        }
        return message;
    }

    public int length(){
        return (int) (offsetEnd - offsetBeg);
    }
    public String getId(){
        return basicProperties.getId();
    }

    public void setId(String id){
        basicProperties.setId(id);
    }
    public String getRoutingKey() {
        return basicProperties.getRoutingKey();
    }

    public void setRoutingKey(String routingKey) {
        basicProperties.setRoutingKey(routingKey);
    }

    public int getDeliverMode() {
        return basicProperties.getDeliverMode();
    }

    public void setDeliverMode(int deliverMode) {
        basicProperties.setDeliverMode(deliverMode);
    }
}
